package console

import (
	"strings"
	"time"
)

const (
	timeFormat = "2006-01-02 15:04:05"
	timeLength = len(timeFormat)
)

// wrapMsg 包装控制台切片消息, 插入时间
func wrapMsg(msgs ...any) []any {
	vars := make([]any, 0, len(msgs)+1)
	vars = append(vars, time.Now().Format(timeFormat))
	return append(vars, msgs...)
}

// wrapMsgF 包装控制台格式化信息, 插入时间
func wrapMsgF(format string) string {
	var b strings.Builder
	// 缓冲区大小：时间长度 + 格式字符串长度 + 1空格 + 1换行符
	b.Grow(timeLength + len(format) + 2)
	b.WriteString(time.Now().Format(timeFormat))
	b.WriteByte(' ')
	b.WriteString(format)
	b.WriteByte('\n')
	return b.String()
}

// Debug 输出带时间的控制台信息(无色)
func Debug(a ...any) (n int, err error) {
	if !isDebug {
		return 0, nil
	}
	return noColor.Println(wrapMsg(a...)...)
}

// DebugF 输出带时间的控制台信息(无色)
func DebugF(format string, a ...any) (n int, err error) {
	if !isDebug {
		return 0, nil
	}
	return noColor.Printf(wrapMsgF(format), a...)
}

// Info 输出带时间的控制台信息(蓝色)
func Info(a ...any) (n int, err error) {
	return blue.Println(wrapMsg(a...)...)
}

// Info 输出带时间的控制台信息(蓝色)
func InfoF(format string, a ...any) (n int, err error) {
	return blue.Printf(wrapMsgF(format), a...)
}

// Success 输出带时间的控制台信息(绿色)
func Success(a ...any) (n int, err error) {
	return green.Println(wrapMsg(a...)...)
}

// Success 输出带时间的控制台信息(绿色)
func SuccessF(format string, a ...any) (n int, err error) {
	return green.Printf(wrapMsgF(format), a...)
}

// Warning 输出带时间的控制台信息(黄色)
func Warning(a ...any) (n int, err error) {
	return yellow.Println(wrapMsg(a...)...)
}

// Warning 输出带时间的控制台信息(黄色)
func WarningF(format string, a ...any) (n int, err error) {
	return yellow.Printf(wrapMsgF(format), a...)
}

// Error 输出带时间的控制台信息(红色)
func Error(a ...any) (n int, err error) {
	return red.Println(wrapMsg(a...)...)
}

// ErrorF 输出带时间的控制台信息(红色)
func ErrorF(format string, a ...any) (n int, err error) {
	return red.Printf(wrapMsgF(format), a...)
}
